﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Entidades;
using Negocio;
using Mundialeitor.App_Util;

namespace Mundialeitor
{
    public partial class Boletas : PaginaBase
    {
        private UsuarioEntity usuario;
        public UsuarioEntity Usuario
        {
            get { return usuario; }
            set { usuario = value; }
        }

        public EtapaEntity Etapa
        {
            get { return (EtapaEntity)Session["etapa"]; }
            set { Session["etapa"] = value; }
        }

        public BoletaEntity Boleta
        {
            get { return (BoletaEntity)Session["boleta"]; }
            set { Session["boleta"] = value; }
        }

        public List<PartidoEntity> Detalles
        {
            get { return (List<PartidoEntity>)Session["grillaDetalle"]; }
            set { Session["grillaDetalle"] = value; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                Usuario = (UsuarioEntity)Session["usuario"];

                if (Usuario != null && Usuario.TipoUsuario.Id == (int)EnumTipoUsuario.Administrador)
                {
                    if (!IsPostBack)
                    {
                        Utilidades.CargarCombo(ddlUsuarioConsulta, new UsuarioRules().SeleccionarTodos(), "Login", "Login", "Todos");
                        Utilidades.CargarCombo(ddlEtapaConsulta, new EtapaRules().SeleccionarTodas(), "Nombre", "Id", "Todas");
                        Utilidades.CargarCombo(ddlEtapa, new EtapaRules().SeleccionarTodas(), "Nombre", "Id", "Seleccione");
                    }
                }
                else
                {
                    Server.Transfer(PagesConstants.Login);
                }

            }
            catch (Exception ex)
            {

                MostrarMensaje(ex.Message);
            }
        }

        protected void btnEtapa_Click(object sender, EventArgs e)
        {
            try
            {
                Etapa = new EtapaRules().SeleccionarPorId(int.Parse(ddlEtapa.SelectedValue));
                Session["grillaDetalle"] = Etapa.Partidos;
                gvDetalle.DataSource = Etapa.Partidos;
                gvDetalle.DataBind();
                if (Boleta.Detalle == null)
                    Boleta.Detalle = new List<DetalleBoletaEntity>();
                foreach (PartidoEntity p in Etapa.Partidos)
                    Boleta.Detalle.Add(new DetalleBoletaEntity() { Partido = p, Resultado = string.Empty });
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }
        

        protected void btnNueva_Click(object sender, EventArgs e)
        {
            try
            {
                Boleta = new BoletaEntity();
                Session["boletaSeleccionada"] = null;
                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvDetalle_RowCreated(object sender, GridViewRowEventArgs e)
        {
            try
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    var detalles = (List<PartidoEntity>)Session["grillaDetalle"];
                    Label lbl;                    
                    Image img;
                    lbl = (Label)e.Row.FindControl("lblNro");
                    lbl.Text = (e.Row.RowIndex + 1).ToString();
                    img = (Image)e.Row.FindControl("imgBanderaLocal");
                    img.ImageUrl = "~/App_Themes/Banderas/" + detalles[e.Row.RowIndex].Local.Abreviatura + ".gif";
                    img = (Image)e.Row.FindControl("imgBanderaVisitante");
                    img.ImageUrl = "~/App_Themes/Banderas/" + detalles[e.Row.RowIndex].Visitante.Abreviatura + ".gif";
                }

                if (!Etapa.PermiteEmpate)
                {
                    CheckBox chk = (CheckBox)e.Row.FindControl("chkEmpate");
                    chk.Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvBoletas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (!(e.CommandName == "Ver" || e.CommandName == "Eliminar"))
                {
                    return;
                }

                gvBoletas.SelectedIndex = Convert.ToInt32(e.CommandArgument);
                int id = int.Parse(gvBoletas.SelectedDataKey["Id"].ToString());

                BoletaEntity boletaSeleccionada = ObtenerBoleta(id);
                Session["boletaSeleccionada"] = boletaSeleccionada;

                // Definir el estado del control de usuario
                switch (e.CommandName)
                {
                    case "Ver":
                        CargarBoleta(boletaSeleccionada, true);
                        break;
                    case "Eliminar":
                        CargarBoleta(boletaSeleccionada, false);
                        break;
                }

                ModoConsulta(false);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvBoletas_RowCreated(object sender, GridViewRowEventArgs e)
        {
            try
            {
                // Asociación de CommandArgument de cada fila con el id de la entidad
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    ImageButton btn;
                    //Boton Ver
                    btn = (ImageButton)e.Row.FindControl("btnVer");
                    btn.CommandArgument = e.Row.RowIndex.ToString();
                    //Boton Eliminar
                    //btn = (ImageButton)e.Row.FindControl("btnEliminar");
                    //btn.CommandArgument = e.Row.RowIndex.ToString();
                }
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void gvBoletas_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            try
            {
                gvBoletas.PageIndex = e.NewPageIndex;
                gvBoletas.DataSource = (List<BoletaEntity>)Session["grillaBoleta"];
                gvBoletas.DataBind();
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        private BoletaEntity ObtenerBoleta(int id)
        {
            List<BoletaEntity> lista = (List<BoletaEntity>)Session["grillaBoleta"];
            return (from b in lista where b.Id == id select b).FirstOrDefault();
        }

        private void CargarBoleta(BoletaEntity obj, bool valor)
        {
            foreach (ListItem item in ddlEtapa.Items)
                item.Selected = false;
            ddlEtapa.Items.FindByValue(obj.Etapa.Id.ToString()).Selected = true;
            //ddlEtapa.SelectedIndex = ddlEtapa.Items.IndexOf(ddlEtapa.Items.FindByValue(obj.Id.ToString()));
            CargarGrillaDetalle(obj.Etapa.Partidos);
            SetearResultados(obj.Detalle);
            if (obj.Etapa.FechaInicio < DateTime.Now)
            {
                foreach (GridViewRow fila in gvDetalle.Rows)
                {
                    CheckBox chkL = (CheckBox)fila.FindControl("chkLocal");
                    chkL.Enabled = false;
                    CheckBox chkE = (CheckBox)fila.FindControl("chkEmpate");
                    chkE.Enabled = false;
                    CheckBox chkV = (CheckBox)fila.FindControl("chkVisitante");
                    chkV.Enabled = false;
                }
                MostrarMensajeDialogo(EnumTipoDeMensaje.Error, "Ya empezó la etapa y no puede modificarse la boleta");
            }
            else
                gvDetalle.Enabled = true;
            ddlEtapa.Enabled = false;
            btnSeleccionar.Enabled = false;
            gvDetalle.Enabled = valor;
            Boleta = obj;
        }

        private void CargarGrillaBoleta(List<BoletaEntity> lista)
        {
            Session["grillaBoleta"] = lista;
            Utilidades.CargarGrilla(gvBoletas, lista);
        }        

        private void CargarGrillaDetalle(List<PartidoEntity> lista)
        {
            Session["grillaDetalle"] = lista;
            Utilidades.CargarGrilla(gvDetalle, lista);
        }

        private void SetearResultados(List<DetalleBoletaEntity> resultados)
        {
            for (int i = 0; i < gvDetalle.Rows.Count; i++)
            {
                CheckBox chk;
                if (resultados[i].Resultado == EnumResultados.LOCAL.ToString())
                {
                    chk = (CheckBox)gvDetalle.Rows[i].FindControl("chkLocal");
                    chk.Checked = true;
                }
                else if (resultados[i].Resultado == EnumResultados.EMPATE.ToString())
                {
                    chk = (CheckBox)gvDetalle.Rows[i].FindControl("chkEmpate");
                    chk.Checked = true;
                }
                else
                {
                    chk = (CheckBox)gvDetalle.Rows[i].FindControl("chkVisitante");
                    chk.Checked = true;
                }
            }
        }

        private void ModoConsulta(bool valor)
        {
            divConsulta.Visible = valor;
            divBoleta.Visible = !valor;
            //LimpiarGrilla();
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                bool alta = Boleta.Id == 0;
                Boleta.Etapa = Etapa;
                Boleta.FechaCreacion = DateTime.Now;
                Boleta.Usuario = Usuario;
                for (int i = 0; i < gvDetalle.Rows.Count; i++)
                {
                    Boleta.Detalle[i].Resultado = ((CheckBox)gvDetalle.Rows[i].FindControl("chkLocal")).Checked ? EnumResultados.LOCAL.ToString() : (((CheckBox)gvDetalle.Rows[i].FindControl("chkEmpate")).Checked ? EnumResultados.EMPATE.ToString() : EnumResultados.VISITANTE.ToString());
                }
                var regla = new BoletaRules();
                regla.GuardarBoleta(Boleta);
                MostrarMensajeDialogo(EnumTipoDeMensaje.Informacion, alta ? "Boleta se creó exitosamente" : "Boleta modificada exitosamente");
                ModoConsulta(true);
            }
            catch (Exception ex)
            {
                MostrarMensaje(ex.Message);
            }
        }

        protected void btnSeleccionar_Click(object sender, EventArgs e)
        {
            try
            {
                int? nro = txtNumero.Text.Trim().Length > 0 ? int.Parse(txtNumero.Text.Trim()) : (int?)null;
                string user = !string.IsNullOrEmpty(ddlUsuarioConsulta.SelectedValue)? ddlUsuarioConsulta.SelectedValue : null;
                DateTime? fechaDesde = string.IsNullOrEmpty(txtFechaCreacionDesde.Text) ? (DateTime?)null : DateTime.Parse(txtFechaCreacionDesde.Text);
                DateTime? fechaHasta = string.IsNullOrEmpty(txtFechaCreacionHasta.Text) ? (DateTime?)null : DateTime.Parse(txtFechaCreacionHasta.Text);
                int? etapaId = ddlEtapaConsulta.SelectedValue != string.Empty ? int.Parse(ddlEtapaConsulta.SelectedValue) : (int?)null;

                var regla = new BoletaRules();
                var lista = regla.SeleccionarBoletaPorFiltro(null, user, fechaDesde, fechaHasta, etapaId);

                CargarGrillaBoleta(lista);
            }
            catch (Exception ex)
            {

                MostrarMensaje(ex.Message);
            }
        }

        protected void cvBoleta_ServerValidate(object source, ServerValidateEventArgs args)
        {
            bool error = false;
            List<string> validador=new List<string>();
            foreach (GridViewRow fila in gvDetalle.Rows)
            {                
                CheckBox chkL, chkE, chkV;
                chkL = (CheckBox)fila.FindControl("chkLocal");
                chkE = (CheckBox)fila.FindControl("chkEmpate");
                chkV = (CheckBox)fila.FindControl("chkVisitante");
                if ((chkL.Checked && (chkE.Checked || chkV.Checked)) ||
                    (chkE.Checked && chkV.Checked) ||
                    (!chkL.Checked && !chkE.Checked && !chkV.Checked))
                {
                    validador.Add("Seleccione una opcion");
                    error = true;
                }
                else
                    validador.Add("");
            }
            gvValidadores.DataSource = validador;
            gvValidadores.DataBind();
            args.IsValid = !error;
        }
    }
}
